package com.zhang.novel.core.wrapper;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.util.Arrays;
import java.util.List;

/**
 *   XSS攻击原理： HTML是一种超文本标记语言，通过将一些字符特殊地对待来区别文本和标记，例如，小于符号（<）被看作是HTML标签的开始，
 *   <title>与</title>之间的字符是页面的标题等等。当动态页面中插入的内容含有这些特殊字符（如<）时，
 *   用户浏览器会将其误认为是插入了HTML标签，当这些HTML标签引入了一段JavaScript脚本时，
 *   这些脚本程序就将会在用户浏览器中执行。所以，当这些特殊字符不能被动态页面检查或检查出现失误时，就将会产生XSS漏洞。
 */
public class XssHttpServletRequestWarpper extends HttpServletRequestWrapper {
    /**
     * 假如有有html 代码是自己传来的  需要设定对应的name 不过滤
     */
    private static final List<String> noFilterNames = Arrays.asList("content");

    public XssHttpServletRequestWarpper(HttpServletRequest request) {
        super(request);
    }

    @Override
    public String[] getParameterValues(String name) {
        // 先获取所有参数值
        String[] values = super.getParameterValues(name);
        // 判断这些
        if (!noFilterNames.contains(name) && null != values) {
            int length = values.length;
            String[] escapseValues=new String[length];

            for (int i = 0; i < length; i++) {
                // 用特殊字符将HTML代码的<>替换
                escapseValues[i]=values[i].replaceAll("<","&lt;")
                        .replaceAll(">","&gt;");
            }
            // 将处理后的数组返回
            return escapseValues;
        }
        return values;
    }
}
